﻿using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

/// <summary>
/// CModelBase의 요약 설명입니다.
/// </summary>
public class CModelBase : CDatabase
{
    // 텍스트 파일을 읽는 함수
    protected string ReadTextFile(string pFilePath)
    {
        StreamReader reader = new StreamReader(pFilePath, System.Text.Encoding.Default);
        string result = reader.ReadToEnd();
        reader.Close();

        return result;
    }

    // XML텍스트에 알맞게 인코딩해주는 함수
    protected string MakeXMLString(string pOrgStr)
    {
        if (pOrgStr == null)
            return "";

        return pOrgStr.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\0", "");
    }

    // 태그의 프로퍼티값에 들어가는 형태로 변환하는 함수
    protected string MakePropertyString(string pOrgStr)
    {
        if (pOrgStr == null)
            return "";

        return pOrgStr.Replace("&", "&amp;").Replace("\"", "&quot;");
    }

    // 쿼리문의 검색 문자열에 사용할 수 있게 값을 변경한다.
    protected string MakeSearchField(string pOrgStr)
    {
        if (pOrgStr == null)
            return "";

        return pOrgStr.Replace("'", "''").Replace("[", "[[]").Replace("%", "[%]").Replace("_", "[_]");

    }

    // 쿼리문에 사용할 수 있게 값을 변경한다.
    protected string MakeRightField(string pOrgStr)
    {
        if (pOrgStr == null)
            return "";

        return pOrgStr.Replace("'", "''").Replace("\0", "");
    }

    // MakePropertyString의 단축 함수
    protected string MPS(string pOrgStr)
    {
        return MakePropertyString(pOrgStr);
    }

    // MakeRightField의 단축 함수
    protected string MRF(string pOrgStr)
    {
        return MakeRightField(pOrgStr);
    }

    // MakeSearchField의 단축 함수
    protected string MSF(string pOrgStr)
    {
        return MakeSearchField(pOrgStr);
    }

    // 금액에 ',' 표시
    protected string MakePriceFormat(string pOrgStr)
    {
        if (pOrgStr == null)
            return "";

        string price = "";
        string sign = "";

        if (pOrgStr != "" && pOrgStr.Substring(0, 1) == "-")
        {
            sign = "-";
            pOrgStr = pOrgStr.Substring(1);
        }

        while (true)
        {
            if (pOrgStr.Length <= 3)
            {
                price = pOrgStr + price;
                break;
            }
            else
            {
                price = "," + pOrgStr.Substring(pOrgStr.Length - 3) + price;
                pOrgStr = pOrgStr.Substring(0, pOrgStr.Length - 3);
            }
        }

        return sign + price;
    }

    //
    // 암호화, 복호화 관련 함수
    //

    protected string EncodeBase64(string pString)
    {
        System.Text.ASCIIEncoding AE = new System.Text.ASCIIEncoding();
        pString = System.Convert.ToBase64String(AE.GetBytes(pString));

        return pString;
    }

    protected string DecodeBase64(string pString)
    {
        pString = System.Text.Encoding.Default.GetString(System.Convert.FromBase64String(pString));

        return pString;
    }

    //
    // SQL Injection 처리 관련 함수
    //

    protected string CheckNumber(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1)) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    protected string CheckNumberList(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789,";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1)) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    protected string CheckFloatNumber(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789-.";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1)) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    protected string CheckDateField(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789-";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1).ToLower()) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    protected string CheckDateTimeField(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789-: ";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1).ToLower()) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    protected string CheckDatabaseField(string pString)
    {
        if (pString == null)
            return null;

        string number = "0123456789_abcdefghijklmnopqrstuvwxyz:.";

        for (int i = 0; i < pString.Length; i++)
        {
            if (number.IndexOf(pString.Substring(i, 1).ToLower()) == -1)
            {
                throw (new Exception("잘못된 인자입니다."));
            }
        }

        return pString;
    }

    //
    // 데이터 베이스 레코드를 다른 구조체로 변환하는 함수
    //

    protected void ConvertDrToHashtable(SqlDataReader dr, Hashtable map)
    {
        for (int i = 0; i < dr.FieldCount; i++)
        {
            map.Add(dr.GetName(i), dr.GetValue(i).ToString());
        }
    }

    protected void ConvertDrToArrayList(SqlDataReader dr, ArrayList list)
    {
        while (dr.Read())
        {
            Hashtable map = new Hashtable();

            for (int i = 0; i < dr.FieldCount; i++)
            {
                map.Add(dr.GetName(i), dr.GetValue(i).ToString());
            }

            list.Add(map);
        }
    }

    //
    // 기타 함수
    //

    protected string CheckNull(object param)
    {
        if (param == null)
            return "";

        return (string)param;
    }

    protected string ConvertSolarToLunar(string datestr)
    {
        DateTime date = DateTime.Parse(datestr);

        System.Globalization.KoreanLunisolarCalendar solarlunar = new System.Globalization.KoreanLunisolarCalendar();

        int lunaryear = solarlunar.GetYear(date);
        int lunarmonth = solarlunar.GetMonth(date);
        int lunarday = solarlunar.GetDayOfMonth(date);

        if (solarlunar.GetMonthsInYear(lunaryear) > 12)
        {
            int leapmonth = solarlunar.GetLeapMonth(lunaryear);

            if (lunarmonth >= leapmonth)
                lunarmonth--;
        }

        return lunaryear.ToString() + "-" + ((lunarmonth < 10) ? "0" + lunarmonth.ToString() : lunarmonth.ToString()) + "-" + ((lunarday < 10) ? "0" + lunarday.ToString() : lunarday.ToString());
    }
}